背景介绍
CycleGAN(Cycle Consistent Generative Adversarial Networks, 循环一致生成式对抗网络):于2017年发表在ICCV上,可以实现图像的风格迁移,风格迁移是GAN网络提出后才出现在人们视野里面的图像处理算法,在生成式对抗网络问世之前,人们很难通过传统的图像处理算法实现风格迁移,今天带小伙伴们看一看瞧一瞧。
CycleGAN理论思想
CycleGAN引入了4个网络结构,分别是生成器GAB,生成器GBA,判别器DA,判别器DB。
GAB的输入是风格A的图像,输出是风格B的图像,目的是将风格A的图像转换为风格B的图像。
GBA的输入是风格B的图像,输出是风格A的图像,目的是将风格B的图像转换为风格A的图像。
DA的输入是风格A的图像,输出是对输入图像的分类,目的是判断输入图像是否为由B转换的风格A的图像
DB的输入是风格B的图像,输出是对输入图像的分类,目的是判断输入图像是否为由A转换的风格B的图像
其中的图像名称有很多,在这里进行简单的介绍。
image_A, image_B指数据集中读取的真实图像,使用DA和DB进行预测时,结果应该是全1。
fake_A指imge_B由GBA生成的风格A类型的图像,使用DA预测时,希望应该是全1,fake_B指imge_A由GAB生成的风格B类型的图像,使用DB预测时,希望应该是全1。
recon_A指fake_B由GBA生成风格A类型的图像,也就是原图image_A经过GAB,再经过GBA生成风格A的图像,希望和image_A越接近越好。
recon_B指fake_A由GAB生成风格B类型的图像,也就是原图image_B经过GBA,再经过GAB生成风格B的图像,希望和image_B越接近越好。
self_A指image_A由GBA生成的风格A类型的图像,因为GBA是将风格B的图像转换为风格A的图像,输入风格A的图像,应该是不会产生变化,希望和image_A越接近越好。
self_B指image_B由GAB生成的风格B类型的图像,因为GAB是将风格A的图像转换为风格B的图像,输入风格B的图像,应该是不会产生变化,希望和image_B越接近越好。
CycelGAN的特点
使用InstanceNormalization代替BatchNormalization。
生成器使用下采样+ResNet结构+上采样对图像进行深层特征提取。
生成器损失函数采用绝对误差,判别器损失函数采用均方误差。
对生成器损失函数的权重进行调节,使网络更多关注于生成的图像质量。
CycleGAN图像分析
TensorFlow2.0实现
1 | import os |
模型运行结果
小技巧
- 图像输入可以先将其归一化到0-1之间或者-1-1之间,因为网络的参数一般都比较小,所以归一化后计算方便,收敛较快。
- 注意其中的一些维度变换和numpy,tensorflow常用操作,否则在阅读代码时可能会产生一些困难。
- 可以设置一些权重的保存方式,学习率的下降方式和早停方式。
- CycleGAN对于网络结构,优化器参数,网络层的一些超参数都是非常敏感的,效果不好不容易发现原因,这可能需要较多的工程实践经验。
- 先创建判别器,然后进行compile,这样判别器就固定了,然后创建生成器时,不要训练判别器,需要将判别器的trainable改成False,此时不会影响之前固定的判别器,这个可以通过模型的_collection_collected_trainable_weights属性查看,如果该属性为空,则模型不训练,否则模型可以训练,compile之后,该属性固定,无论后面如何修改trainable,只要不重新compile,都不影响训练。
- 在CycleGAN的测试图像中,为了体现模型的效果,第一行的奇数个为拍摄的照片,第一行的偶数个为转换风格后的莫奈风格画作,第二行的奇数个为莫奈风格的画作,第二行的偶数个为转换风格后的照片,这里只是训练了2000代,而且每一代只有2个图像就可以看出CycleGAN的效果。小伙伴们可以选择更大的数据集,更加快速的GPU,训练更长的时间,这样风格迁移的效果就会更加明显。
CycleGAN小结
CycleGAN是一种有效的风格迁移生成式对抗网络,从上图可以看出CycleGAN模型的参数量只有28M,可以实现任意风格之间的迁移,如果数据集足够,还可以生成人物表情包,是不是非常有趣呢?小伙伴们一定要掌握它。